package com.hualan.sfzy.service.impl.consult;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hualan.sfzy.constant.CommonConstant;
import com.hualan.sfzy.mapper.consult.ConsultExpertiseMapper;
import com.hualan.sfzy.mapper.consult.ConsultMapper;
import com.hualan.sfzy.mapper.permission.SystemUsersMapper;
import com.hualan.sfzy.mapper.permission.UserRoleMapper;
import com.hualan.sfzy.model.entity.Consult;
import com.hualan.sfzy.model.entity.ConsultExpertise;
import com.hualan.sfzy.model.entity.SystemUsers;
import com.hualan.sfzy.model.entity.UserRole;
import com.hualan.sfzy.model.vo.ConsultVO;
import com.hualan.sfzy.service.BaseService;
import com.hualan.sfzy.service.impl.permission.SystemUsersServiceImpl;
import com.hualan.sfzy.service.impl.permission.UserRoleServiceImpl;
import com.hualan.sfzy.utils.MD5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ConsultServiceImpl implements BaseService<Consult> {
    @Autowired
    private ConsultMapper mapper;
    @Autowired
    private SystemUsersMapper systemUsersMapper;
    @Autowired
    private UserRoleMapper userRoleMapper;
    @Autowired
    private ConsultExpertiseMapper consultExpertiseMapper;

    @Override
    @Transactional
    public int add(Consult entity) {
        // TODO 添加咨询师需要，将咨询师添加到用户表 然后添加到用户角色中间表

        /**
         * 不能使用Service层，应该使用Mapper层
         * 直接调用系统用户表添加用户，会向用户表添加数据然后还会向用户角色中间表添加数据
         * 继续调用系统用户表添加用户，会向用户表添加数据然后还会向用户角色中间表添加数据
         * 添加了两次 用户角色中间表数据重复    会出错 不能再调用用户中间表添加数据
         */

        if(mapper.insert(entity)>0){
            SystemUsers systemUsers = new SystemUsers();
            systemUsers.setUsername(entity.getMobile());// 手机号作为用户名
            String encode = MD5Util.encode(CommonConstant.PASSWORD_DEFAULT);
            systemUsers.setUserpwd(encode);// 密码默认为123456

            systemUsers.setMobile(entity.getMobile());// 手机号作为手机号
            systemUsers.setEmail(entity.getEmail());// 邮箱
            systemUsers.setNickname(entity.getConsultName());// 真实姓名

            System.out.println("返回id值1为："+systemUsers.getId());

            // 将咨询师添加到用户表
            if(systemUsersMapper.insert(systemUsers)>0){
                // 根据咨询师的 job  向用户角色中间表添加数据
                // job=咨询师  用户角色中间表为  3
                // job=心理导师  用户角色中间表为  4
                if (entity.getJob().equals("咨询师")) {
                    System.out.println("返回id值2为："+systemUsers.getId());
                    // 判断是否向用户角色中间表添加数据
                     if(userRoleMapper.insert(new UserRole(null, systemUsers.getId(), 3, 0, null, null))>0){
                         System.out.println("返回id值3为："+systemUsers.getId());
//                        return 1;
//                         // 封装擅长领域
                         ArrayList<ConsultExpertise> list = new ArrayList<>();
                         System.out.println("list:"+list);
                         for (Integer expertiseid : entity.getList()) {
                             list.add(new ConsultExpertise(null, entity.getId(), expertiseid, 0, null, null));
                         }
                         // 判断是否向咨询师擅长领域中间表添加数据
                          if(consultExpertiseMapper.insertPro(list)>0)
                          {
                              return 1;
                          }else{
                              throw new RuntimeException("添加擅长领域异常");
                          }
//                          return 1;

                     }else{
                         throw new RuntimeException("添加用户角色异常");

                     }
                } else {
                    // 判断是否向用户角色中间表添加数据
                     if(userRoleMapper.insert(new UserRole(null, systemUsers.getId(), 4, 0, null, null))>0){
                         return 1;
                     }else{
                         throw new RuntimeException("添加用户角色异常");
                     }
                }
            }
            else{
                throw new RuntimeException("添加用户异常");
            }
        }else {
            throw new RuntimeException("添加咨询师异常");
        }
    }

    @Override
    @Transactional
    public int edit(Consult entity) {
        if(mapper.update(entity)>0){
            consultExpertiseMapper.deletePro(entity.getId()); // 先删除他的擅长领域，然后再添加
            ArrayList<ConsultExpertise> list = new ArrayList<>();
            for (Integer expertiseid : entity.getList()) {
                list.add(new ConsultExpertise(null, entity.getId(), expertiseid, 0, null, null));
            }
            if(consultExpertiseMapper.insertPro(list)>0){
                return 1;
            }else{
                return 0;
            }
        }
        return 0;

    }

    @Override
    public int remove(Integer id) {
        return mapper.delete(id);
    }

    @Override
    public int removeBatch(Integer[] ids) {
        return mapper.deleteBatch(ids);
    }

    @Override
    public List<Consult> find() {
        return mapper.select(null);
    }

    @Override
    public Map<String, Object> findPage(Integer pageNum, Integer pageSize, Consult entity) {
        PageHelper.startPage(pageNum, pageSize);
        List<Consult> list = mapper.select(entity);
        PageInfo<Consult> info = new PageInfo<>(list);
        Map<String, Object> map = new HashMap<>();
        map.put(CommonConstant.PAGE_LIST, list);
        map.put(CommonConstant.PAGE_TOTAL, info.getPages());
        map.put(CommonConstant.TOTAL, info.getTotal());
        return map;
    }

    @Override
    public Consult findById(Integer id) {
        return mapper.selectById(id);
    }

    //  动态查询 小程序搜索咨询师
    //  public List<Consult> selectBySearch();
    //   小程序 根据ids 动态分页查询
    //   public List<Consult> selectBySearchPage();
    public Map<String, Object> selectBySearchPage(Integer pageNum, Integer pageSize, ConsultVO vo)
    {
        List<Consult> list = mapper.selectBySearch(vo);
        ArrayList<Integer> list1 = new ArrayList<>();
        for (Consult consult : list) {
            list1.add(consult.getId());
        }
        PageHelper.startPage(pageNum, pageSize);
        List<Consult> selectedBySearchPage = mapper.selectBySearchPage(list1);

        PageInfo<Consult> info = new PageInfo<>(selectedBySearchPage);
        Map<String, Object> map = new HashMap<>();
        map.put(CommonConstant.PAGE_LIST, selectedBySearchPage);
        map.put(CommonConstant.PAGE_TOTAL, info.getPages());
        map.put(CommonConstant.TOTAL, info.getTotal());
        return map;
    }

}
